package com.maven.demo1;


import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;


@RequestMapping("/demo1")
@RestController
public class DemoController {
    // 默认情况下设置的 GET 和 POST 请求都可以访问到
    @RequestMapping("/r1")
    public String r1() {
        return "你好呀";
    }

    // 这里我们可以手动设置 请求的类型
    @RequestMapping(value = "/r2",method = RequestMethod.GET)
    public String r2() {
        return "how are you ? ";
    }

    // 当然上述的都是不带参数的，那我们是否可以传参呢
    // 先传一个参数
    @RequestMapping("/r3")
    // 这里需要注意的是 ： 你所传的参数的名称 必须跟 你请求的 名称一致，
    // 否则就会 获取不到 对应的数据
    public String r3(String name) {
        return "name :" + name;
    }

    @RequestMapping("/r4")
    // 传多个参数时
    // 如果 像下面这样进行传参，
    // 如果 客户端的请求中的 age 不存在的时候，这里就会报错：Optional int parameter 'age' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type
    // 简单来说，就是 我们在获取 相应的数据的时候，是Spring 在进行获取，而Spring 获取的数据 基本是 String 类型的
    // 而 String 类型的无法强转至 int ，所以 这里我们应该将其修改为 包装类型的 Integer
    public String r4(String name,int age) {
        return "name :" + name + " age :" + age;
    }

    @RequestMapping("/r5")
    public String r5(String name,Integer age) {
        return "name :" + name + " age :" + age;
    }

    // 如果我们 后续要修改 传入参数的名称时，由于 我们只进行后端的代码编写
    // 如果只在我们这修改就会导致 收不到传过来的 参数数据
    // 但是如果整体修改的话就会 太麻烦
    // 所以 我们就可以通过 @RequestParam("name") 进行修改
    @RequestMapping("/r6")
    public String r6(@RequestParam("name") String username) {
        return "username :" + username;
    }

    // 上述还存在一个问题 ，就是 当我们进行名字的修改之后，如果不参参数就会报错
    // 所以我们就需要做以下 修改：@RequestParam(value = "name",required = false)
    // 将其置为不必要的即可
    @RequestMapping("/r7")
    public String r7(@RequestParam(value = "name",required = false) String username) {
        return "username :" + username;
    }

    // 当我们传入的参数过多时，我们可以构建一个 类来进行存储我们传入的数据
    // 而且 我们在类中就可以不必须用 包装类来进行 接收数据了
    @RequestMapping("/r8")
    public String r8(User user) {
        return user.toString();
    }

    // 当然我们不止可以传 这种参数，我们还可以传数组作为参数
    @RequestMapping("/r9")
    public String r9(String[] arr) {
        if(arr == null ) return "空的";
        else return Arrays.toString(arr)+" .length:" +arr.length;
    }

    // 同样我们还可以传 链表
    // 传链表有个问题，由于Spring 中是以 数组形式进行数据接收的，
    // 所以我们这里需要做一点调整 :@RequestParam(value = "list",required = false
    @RequestMapping("/r10")
    public String r10(@RequestBody @RequestParam(value = "list",required = false)List<String> list) {
        if(list == null) return "空链表";
        else return list.toString()+" .length:" +list.size();
    }

}
